package com.ruleengine.context.impl;

import org.apache.log4j.Logger;

import com.ruleengine.context.EContextPropertyScope;
import com.ruleengine.context.EContextPropertyType;
import com.ruleengine.context.IContextProperty;

/**
 * 创建双下文中的属性.
 * @author wuxiao
 *
 * Created on Apr 6, 2012
 */
public class ContextPropertyFactory {
    private static Logger logger = Logger.getLogger(ContextPropertyFactory.class);
    private static volatile ContextPropertyFactory factory;
    
    private ContextPropertyFactory(){
    }
    
    public static ContextPropertyFactory getInstance(){
        if(factory == null){
            synchronized(ContextPropertyFactory.class){
                if(factory == null){
                    factory = new ContextPropertyFactory();
                }
            }
        }
        return factory;
    }
    
    /**
     * 新建常量，常量一旦赋值便没法改变
     * @param <T> value值的类型
     * @param key 变量的名称
     * @param scope 变量的作用范围
     * @return 上下文属性对象
     */
    public <T> IContextProperty<T> createConstant(String key, EContextPropertyScope scope){
        return new DefaultContextProperty(key, scope, EContextPropertyType.CONSTANT, false);
    }

    /**
     * 新建常量，常量一旦赋值便没法改变
     * @param <T> value值的类型
     * @param key 变量的名称
     * @param scope 变量的作用范围
     * @return 上下文属性对象
     */
    public <T> IContextProperty<T> createPrivateConstant(String key){
        return new DefaultContextProperty(key, EContextPropertyScope.PRIVATE, EContextPropertyType.CONSTANT, true);
    }

    /**
     * 新建常量，常量一旦赋值便没法改变
     * @param <T> value值的类型
     * @param key 常量的名称
     * @return 上下文属性对象
     */
    public <T> IContextProperty<T> createPublicConstant(String key){
        return createConstant(key, EContextPropertyScope.PUBLIC);
    }
    
    /**
     * 新建变量，变量的值可以随时改变
     * @param key 变量的名称
     * @return 上下文属性对象
     */
    public <T> IContextProperty<T> createPublicVariable(String key){
        return createVariable(key, EContextPropertyScope.PUBLIC);
    }
    /**
     * 新建变量，变量的值可以随时改变
     * @param key 变量的名称
     * @return 上下文属性对象
     */
    public <T> IContextProperty<T> createPrivateVariable(String key){
        return createVariable(key, EContextPropertyScope.PRIVATE);
    }
    
    /**
     * 新建变量，变量的值可以随时改变
     * @param key 变量的名称
     * @param scope 变量的作用范围
     * @return 上下文属性对象
     */
    public <T> IContextProperty<T> createVariable(String key, EContextPropertyScope scope){
        return new DefaultContextProperty(key, scope, EContextPropertyType.VARIABLE, false);
    }
    
}
